iT邦幫忙

2025 iThome 鐵人賽

DAY 21
0
Security

從1到2的召喚羊駝補破網之旅系列 第 21

Day 21 :ISMS 文件 × AI

  • 分享至 

  • xImage
  •  

[鐵人賽] Day 21:ISMS 文件 × AI — 把繁瑣控制項變成查詢助手

✍️ 寫在前面

攻防兩邊都在翻同一份文件,只是角度不同。

所以今天這篇要介紹的,是一個能讓藍隊、紅隊都受益的 AI 工具組合:
RAGFlow + Ollama

我把所有 ISMS 文件丟進本地 RAG,讓 AI 幫我回答:

「這個事件/弱點對應哪條控制?」

從此不用再翻厚厚的手冊,也不怕誤對錯章。


🎯 適用場景

角色 使用情境 效益
🔵 藍隊(內部稽核) 快速查找控制項對應文件、生成稽核回覆 節省比對時間、提升一致性
🔴 紅隊(技術檢測) 自動對照弱點 → 控制項 → 改善依據 報告標準化、減少人為誤差
🟢 顧問 / 教育訓練 對照 ISO 條文與實務案例 教學更直覺、查詢更即時

🧭 一頁快速總覽(架構圖)

flowchart TD
    A[ISMS 文件] --> B[文字切分]
    B --> C[向量化上傳 RAGFlow]
    C --> D[RAGFlow 問答 API]
    D --> E[對話介面]
    E --> F[Ollama LLM]
    F --> G[使用者查詢控制項]

🧩 為什麼要結合文件與 AI

不論是稽核或檢測,最大的時間黑洞在於:

  • 找文件 → 開啟 → 搜尋關鍵字 → 比對條號 → 複製到報告。
  • 稽核員問:「這個控制的依據在哪?」 → 管理員翻半天。
  • 檢測員寫:「此弱點違反控制項 A.12.3.1」 → 常常誤標或漏掉。

AI 可以在這裡發揮價值 ——
它不判斷合不合規,而是幫你快速 對應控制 → 找出證據

我只需要問:「供應商沒輪替憑證,對應哪項控制?」
RAGFlow + Ollama 就能回「A.14.2.7 Supplier service delivery management」,並列出文件出處。


⚙️ 實作流程

1️⃣ 文件準備與清理

  1. 把所有 ISMS 文件放在 ./isms_docs/
  2. 先去除或遮蔽敏感資料(個資、帳號、伺服器名稱)。
  3. 準備 PDF、Word、Excel 檔案。

2️⃣ 文字轉換與分段

使用 Python 小程式 isms_to_chunks.py

import os, json, uuid
from pathlib import Path
from datetime import datetime
from pdfminer.high_level import extract_text
import docx

DOC_DIR = Path("./isms_docs")
OUT_FILE = Path("isms_chunks.jsonl")
CHUNK_SIZE = 800
CHUNK_OVERLAP = 100

def text_from_pdf(path):
    return extract_text(path)

def text_from_docx(path):
    doc = docx.Document(path)
    return "\n".join(p.text for p in doc.paragraphs)

def chunk_text(text, size=CHUNK_SIZE, overlap=CHUNK_OVERLAP):
    i = 0
    chunks = []
    while i < len(text):
        chunk = text[i:i+size]
        chunks.append(chunk.strip())
        i += size - overlap
    return chunks

with OUT_FILE.open("w", encoding="utf-8") as out:
    for f in DOC_DIR.iterdir():
        if f.suffix.lower() in [".pdf"]:
            txt = text_from_pdf(str(f))
        elif f.suffix.lower() in [".docx", ".doc"]:
            txt = text_from_docx(str(f))
        elif f.suffix.lower() in [".txt"]:
            txt = f.read_text(encoding="utf-8")
        else:
            continue
        chunks = chunk_text(txt)
        for idx, c in enumerate(chunks):
            doc = {
                "id": str(uuid.uuid4()),
                "source": f.name,
                "chunk_index": idx,
                "text": c,
                "timestamp": datetime.utcnow().isoformat() + "Z"
            }
            out.write(json.dumps(doc, ensure_ascii=False) + "\n")

3️⃣ 上傳到 RAGFlow

curl -X POST "http://localhost:3000/api/documents/bulk_import" \
  -H "Content-Type: application/jsonl" \
  --data-binary @isms_chunks.jsonl

上傳後,RAGFlow 會自動向量化並建立可搜尋的索引。


4️⃣ 設定 Ollama + Prompt

System Prompt 範例:

你是 ISMS 查詢助理。
使用者會提供一段情境,例如「供應商未輪替憑證」。
請回答:
1) 對應的 ISO/ISMS 控制項代號與名稱。
2) 一句理由(2–3 行)。
3) 提供引用來源(檔名 + chunk index + 摘錄 100 字內)。
禁止捏造條號。

User Prompt 範例:

外包廠商沒有在期限內替換到期憑證,違反哪個 ISMS 控制?

📘 範例互動(模擬)

User: 第三方供應商未更新 TLS 憑證
Assistant:
對應控制項: A.14.2.7 Supplier service delivery management
理由: 憑證更新屬於供應商服務交付之安全責任。
引用:

  • ThirdParty_SLA.docx (chunk 3):「供應商應於憑證到期前 30 日完成更新...」
  • ISMS_Policy.pdf (chunk 11):「外部合作廠商需遵守資訊安全憑證政策...」

🧠 雙用架構:同一知識庫,攻防共用

flowchart TD
    A[ISMS 文件庫] --> B[藍隊稽核查詢]
    A --> C[紅隊報告對應控制]
    B --> D[AI 回覆:控制 + 出處]
    C --> D

🧩 攻防螺旋式學習

這也是我每天的訓練方式:

flowchart TD
    A[白天:藍隊稽核 / 防守] --> B[盤點弱點報告]
    B --> C[轉化成防守需求]
    C --> D[晚上:紅隊模擬 / 攻擊]
    D --> E[彙整報告 + 控制對照]
    E --> F[回饋藍隊強化防禦]
    F --> A

AI 幫我串起這個循環 ——
白天學到的漏洞對應控制,晚上用來驗證攻擊面;
晚上發現的新弱點,隔天再讓 AI 幫我找對應控制條款與改善建議。

攻與防互為鏡像。AI 讓螺旋式成長真正落地。


🔐 常見風險與對策

問題 解法
LLM 胡亂產生控制號 明確禁止生成條號、限制回答引用文件
敏感文件外洩風險 全程本地化(Ollama + RAGFlow),先做脫敏處理
查詢結果不穩 微調 chunk size(600–1000字),top_k = 5–8
文件更新不同步 版本控制 + 再次向量化(建議定期自動化)

🚀 延伸應用

  • 自動生成稽核回覆句式

    「本項控制已落實,透過 AD 登錄機制與日誌記錄。」

  • 紅隊報告模板整合
    將 AI 回傳控制項直接嵌入報告欄位,標準化輸出格式。

  • 多語言對應(中英)
    RAGFlow 支援中文文件、英文條文並存,
    查詢可同時回傳中英對照版本。


✅ 小結

  • 稽核不再需要人海戰術翻文件。
  • 紅隊報告能自動對照控制與依據。
  • AI 不是取代,而是加速我們的理解與決策。

只要文件整理好,
RAGFlow + Ollama 就能幫你把「文件堆」變成「查詢助理」。
不論你是藍隊還是紅隊,一句話找到對應控制項。


上一篇
Day 20 : [副本]英文不要這樣說
下一篇
Day 22:官方推薦的提示詞
系列文
從1到2的召喚羊駝補破網之旅24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言